package com.itheima.datastructure.array;

import java.util.Arrays;
import java.util.Iterator;
import java.util.function.Consumer;
import java.util.stream.IntStream;

public class DynamicArray implements Iterable<Integer>{
    private int size=0;//逻辑大小
    private int capacity=8;//容器
    private int[] array={};

    public void addLast(int element){
//        array[size]=element;
//        size++;
        add(size,element);
    }

    public void add(int index,int element){
        checkAndGrow();
        if(index>=0 && index<size){
            //先将数组进行拷贝，将index位置空闲出来
            System.arraycopy(array,index,array,index+1,size-index);
            array[index]=element;
            size++;
        }
        array[size]=element;
        size++;
    }



    private void checkAndGrow() {
        if(size==0){
            array=new int[capacity];
        }
        //容量检查
        else if(size==capacity){
            //进行扩容
            capacity+=capacity>>1;
            int [] newArray=new int[capacity];
            System.arraycopy(array,0,newArray,0,size);
            array=newArray;
        }
    }

    public int get(int indedx){
        return array[indedx];
    }

    //借助函数式接口遍历
    public void foreach(Consumer<Integer> consumer){
        for(int i=0;i<size;i++){
            /*System.out.println(array[i]);*/
            consumer.accept(array[i]);
        }
    }

    //利用迭代器遍历
    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            int i=0;
            @Override
            public boolean hasNext() {
                return i<size;
            }

            @Override
            public Integer next() {
                return array[i++];
            }
        };
    }

    //利用流的方式进行遍历
    public IntStream stream(){
        //只添加数组有效的部分
        return IntStream.of(Arrays.copyOfRange(array,0,size));
    }

    //删除方法
    public int remove(int index){
        int removed=array[index];
        if(index<size-1){
            System.arraycopy(array,index+1,array,index,size-index-1);
        }
        size--;
        return removed;
    }



}
